/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.gob.foncodes.ssa.web.controller;

import java.util.List;
import java.util.ArrayList;
import java.util.Collection;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.apache.log4j.Logger;

import pe.gob.foncodes.ssa.bs.common.controller.GenericController;
import pe.gob.foncodes.ssa.bs.common.util.Constante;
import pe.gob.foncodes.ssa.bs.common.util.ServiceException;
import pe.gob.foncodes.ssa.bs.seguridad.domain.Modulo;
import pe.gob.foncodes.ssa.web.beans.ConexionPorPerfilBean;
import pe.gob.foncodes.ssa.web.util.Impresion;

/**
 *
 * @author ZambaTechnologies SAC
 */
public class ReporteConexionesPorPerfilController extends GenericController {

    protected static Logger log = Logger.getLogger(ReporteConexionesPorPerfilController.class);
    private String busCodUsuario;
    private String busNomUsuario;
    private String busModulo;
    private List<Modulo> lstModulo;
    private List<ConexionPorPerfilBean> lstConexionPorPerfil;

    @Override
    public void init() {
        this.busCodUsuario = "";
        this.busNomUsuario = "";
        this.busModulo = "-99";
        lstConexionPorPerfil = new ArrayList<ConexionPorPerfilBean>();
    }

    @Override
    public void search(ActionEvent event) throws Exception {
        log.info("Ejecutando filtro reporte de Conexiones Por Perfil");
        this.busCodUsuario = (this.busCodUsuario == null) ? null : "%" + this.busCodUsuario.trim().toUpperCase() + "%";
        this.busNomUsuario = (this.busNomUsuario == null) ? null : "%" + this.busNomUsuario.trim().toUpperCase() + "%";
        Long oModulo = (this.busModulo == null || this.busModulo.equals("-99")) ? null : Long.parseLong(this.busModulo);

        String sql = null;
        sql = "SELECT u.cod_Usuario, ";
        sql += " u.txt_Apellido_Paterno || ' ' || u.Txt_Apellido_Materno || ' ' || u.txt_Nombres,";
        sql += " mo.txt_Modulo, p.txt_Perfil, to_char(c.nid_conexion) || ' - ' || c.txt_Conexion,";
        sql += " p.flg_perfil_base, up.flg_Consulta, p.flg_Activo";
        sql += " FROM ssa.Usuario u";
        sql += " INNER JOIN ssa.usuario_perfil up on u.nid_usuario = up.nid_usuario";
        sql += " INNER JOIN ssa.perfil p on up.nid_perfil = p.nid_perfil";
        sql += " INNER JOIN (";
        sql += " SELECT m.nid_modulo, m.txt_modulo";
        sql += " FROM ssa.modulo m";
        sql += " WHERE m.flg_Activo = " + Constante.ESTADO_ACTIVO;
        if (oModulo != null) {
            sql += " START WITH m.nid_modulo = " + String.valueOf(oModulo);
        } else {
            sql += " START WITH m.nid_modulo_padre IS NULL";
        }
        sql += " CONNECT BY PRIOR m.nid_modulo = m.nid_modulo_padre) mo on p.nid_modulo = mo.nid_modulo";
        sql += " INNER JOIN ssa.conexion c on c.nid_conexion = p.nid_conexion";
        sql += " WHERE u.flg_Activo = " + Constante.ESTADO_ACTIVO;
        sql += " AND up.flg_Activo = " + Constante.ESTADO_ACTIVO;
        if (this.busCodUsuario != null) {
            sql += " AND u.cod_Usuario LIKE '" + this.busCodUsuario + "'";
        }
        if (this.busNomUsuario != null) {
            sql += " AND UPPER(u.txt_Apellido_Paterno || ' ' || u.txt_Apellido_Materno || ' ' || u.txt_Nombres) LIKE '" + this.busNomUsuario + "'";
        }
        sql += " ORDER BY u.cod_Usuario, mo.txt_Modulo, p.txt_Perfil";
        List<Object[]> olstConexionesPorPerfil = getService().createNativeQuery(sql, new Object[]{});

        this.lstConexionPorPerfil = new ArrayList<ConexionPorPerfilBean>();
        for (Object[] obj : olstConexionesPorPerfil) {
            ConexionPorPerfilBean oConexion = new ConexionPorPerfilBean();
            oConexion.setCOD_USUARIO(obj[0].toString());
            oConexion.setTXT_APENOM(obj[1].toString());
            oConexion.setTXT_MODULO(obj[2].toString());
            oConexion.setTXT_PERFIL(obj[3].toString());
            oConexion.setTXT_CONEXION(obj[4].toString());
            oConexion.setFLG_PERFIL_BASE(obj[5].toString());
            oConexion.setFLG_CONSULTA(obj[6].toString());
            oConexion.setFLG_ACTIVO(obj[7].toString());
            this.lstConexionPorPerfil.add(oConexion);
        }
    }

    public void limpiar() {
        this.busCodUsuario = "";
        this.busNomUsuario = "";
        this.busModulo = "-99";
        this.lstConexionPorPerfil = new ArrayList<ConexionPorPerfilBean>();
    }

    public void print(int tipo) {
        try {
            Collection col = new ArrayList();
            for (ConexionPorPerfilBean oConexion : this.lstConexionPorPerfil) {
                col.add(oConexion);
            }
            String filtros = "";
            if (this.busCodUsuario != null && !this.busCodUsuario.equals("")) {
                filtros = String.format("%s %s , ", "Código usuario:", this.busCodUsuario);
            }
            if (this.busNomUsuario != null && !this.busNomUsuario.equals("")) {
                filtros = String.format("%s %s %s , ", filtros, "Nombre usuario:", this.busNomUsuario);
            }
            if (this.busModulo != null && !this.busModulo.equals("-99")) {
                Modulo oModulo = (Modulo) getService().findByNamedQuery("Modulo.findByNidModulo", new Object[]{Long.parseLong(this.busModulo)}).get(0);
                filtros = String.format("%s %s %s , ", filtros, "Módulo: ", oModulo.getTxtModulo());
            } else {
                filtros = String.format("%s %s , ", filtros, "Módulo: (Todos)");
            }
            if (filtros == null || filtros.equals("")) {
                filtros = "(Todos los registros)";
            } else {
                if (filtros.substring(filtros.length() - 2).trim().equals(",")) {
                    String tmp = "";
                    tmp = filtros.substring(0, filtros.length() - 2);
                    filtros = tmp;
                }
            }
            Impresion imprimir = new Impresion();
            if (tipo == 0) {
                imprimir.imprimirListado("ssa_rpt_conexion_x_perfil", col, filtros.toString());
            } else if (tipo == 1) {
                imprimir.exportarExcel("ssa_rpt_conexion_x_perfil", col, filtros.toString());
            }
        } catch (Exception ex) {
            log.error(ex);
        } finally {
            FacesContext.getCurrentInstance().responseComplete();
        }

    }

    /**
     * @return the busCodUsuario
     */
    public String getBusCodUsuario() {
        return busCodUsuario;
    }

    /**
     * @param busCodUsuario the busCodUsuario to set
     */
    public void setBusCodUsuario(String busCodUsuario) {
        this.busCodUsuario = busCodUsuario;
    }

    /**
     * @return the busNomUsuario
     */
    public String getBusNomUsuario() {
        return busNomUsuario;
    }

    /**
     * @param busNomUsuario the busNomUsuario to set
     */
    public void setBusNomUsuario(String busNomUsuario) {
        this.busNomUsuario = busNomUsuario;
    }

    /**
     * @return the lstConexionPorPerfil
     */
    public List<ConexionPorPerfilBean> getLstConexionPorPerfil() {
        return lstConexionPorPerfil;
    }

    /**
     * @param lstConexionPorPerfil the lstConexionPorPerfil to set
     */
    public void setLstConexionPorPerfil(List<ConexionPorPerfilBean> lstConexionPorPerfil) {
        this.lstConexionPorPerfil = lstConexionPorPerfil;
    }

    /**
     * @return the lstModulo
     */
    public List<Modulo> getLstModulo() throws ServiceException {
        //this.lstModulo = getService().findByNamedQuery("Modulo.findByFlgActivo", new Object[]{"1"});
        this.lstModulo = getService().findByNamedQuery("Modulo.findOnlyNidModuloPadre", new Object[]{});
        return lstModulo;
    }

    /**
     * @param lstModulo the lstModulo to set
     */
    public void setLstModulo(List<Modulo> lstModulo) {
        this.lstModulo = lstModulo;
    }

    /**
     * @return the busModulo
     */
    public String getBusModulo() {
        return busModulo;
    }

    /**
     * @param busModulo the busModulo to set
     */
    public void setBusModulo(String busModulo) {
        this.busModulo = busModulo;
    }
}
